home *** CD-ROM | disk | FTP | other *** search
- ─────────────────────────────────────────────────────────────────────────────
- ASM2.TXT - intro to keyboard and flow control
- ─────────────────────────────────────────────────────────────────────────────
-
- Alright. This bit of code introduces control flow, keyboard input, and
- a way to easily print out one character.
-
- ────────
- First off, lets examine the easiest one: printing a character.
-
- It's like this: you put the character to print in DL, put 2 in AH and
- call interrupt 21h. Damn easy.
-
- ────────
- Ok, lets look at the next easiest one: keyboard input.
-
- There are quite a few functions related to INT 16h (the keyboard
- interrupt.) They are:
-
- FUNCTION#
- ---------
-
- 0h -Gets a key from the keyboard buffer. If there isn't one, it waits
- until there is.
- Returns the SCAN code in ah, and the ASCII translation in AL
-
- 1h -Checks to see if a key is ready to grab. Sets the zero flag if a
- key is ready to grab. Grab it with Fn# 0
- This also returns the same info about the key as Fn#0, but does
- not remove it from the buffer.
-
- 2h -Returns the shift flags in al. They are:
- bit 7 - Insert active
- bit 6 - Caps lock active
- bit 5 - Num Lock active
- bit 4 - Scroll lock active
- bit 3 - Alt pressed
- bit 2 - Ctrl pressed
- bit 1 - Left shift pressed
- bit 0 - right shift pressed
-
- 3h -You can set the Typematic Rate and delay with this function
- registers must be set as follows
- AL = 5
- BH = Delay value (0-3: 250,500,750,1000 millisec)
- BL = Typematic rate (0-1fh) 1fh = slowest (2 chars per sec)
- 0 =fastest (30 chars per second)
-
- 4h -Key Click control - not important
-
- 5h -STUFF the keyboard
- input:
- CH = scan code
- CL = ascii code
-
- output:
- al = 0 no error
- al = 1 keyboard buffer is full
-
- 10h -Same as #0, but its for the extended keyboard. Checks all the keys.
-
- 11h -Same as #1, but for the extended keyboard.
-
- 12h -Same as #2, but AH contains additional shift flags:
- bit 7 - Sys req pressed
- bit 6 - Caps lock active
- bit 5 - Num Lock active
- bit 4 - Scroll lock active
- bit 3 - Right Alt active
- bit 2 - Right Ctrl active
- bit 1 - Left Alt active
- bit 0 - Right Alt active
- Al is EXACTLY the same as in Fn#2
-
-
- WHERE AH= the function number when you call INT 16h
-
- ────────
- That's neat-o, eh? Now on to flow controll via CMP and Jcc...
-
- CMP:
- ───
- CMP is the same as SUB, but it does NOT alter any registers, only the
- flags. This is used in conjunction with Jcc.
-
- Jcc:
- ───
- Ok, Jcc is not a real instruction, it means 'jump if conditionis met.'
-
- I'll break this into 3 sections, comparing signed numbers, comparing
- unsigned numbers, and misc.
-
- Note that a number being 'unsigned' or 'signed' only depends on how you
- treat it. That's why there are different Jcc for each...
-
- If you treat it as a signed number, the highest bit denotes whether it's
- negative or not.
-
- Prove to yourself that 0FFFFh is actually -1 by adding 1 to 0FFFFh. You
- should get a big zero: 00000h. (Remember that the number is ONLY 16 bits
- and the carry dissapears..)
-
- UNSIGNED:
- ────────
- JA -jumps if the first number was above the second number
- JAE -same as above, but will also jump if they are equal
-
- JB -jumps if the first number was below the second
- JBE -duh...
-
- JNA -jumps if the first number was NOT above... (same as JBE)
- JNAE-jumps if the first number was NOT above or the same as..
- (same as JB)
- JNB -jumps if the first number was NOT below... (same as JAE)
- JNBE-jumps if the first number was NOT below or the same as..
- (same as JA)
- JZ -jumps if the two numbers were equal (zero flag = 1)
- JE -same as JZ, just a different name
-
- JNZ -pretty obvious, I hope...
- JNE -same as above...
-
- SIGNED:
- ──────
- JG -jumps if the first number was > the second number
- JGE -same as above, but will also jump if they are equal
-
- JL -jumps if the first number was < the second
- JLE -duh...
-
- JNG -jumps if the first number was NOT >... (same as JLE)
- JNGE-jumps if the first number was NOT >=.. (same as JL)
-
- JNL -jumps if the first number was NOT <... (same as JGE)
- JNLE-jumps if the first number was NOT <=... (same as JG)
-
- JZ, JE, JNZ, JNE - Same as for Unsigned
-
- MISC:
- ────
- JC -jumps if the carry flag is set
- JNC -Go figgure...
-
- Here's the rest of them... I've never had to use these, though...
-
- JO -jump if overflow flag is set
- JNO -...
-
- JP -jump is parity flag is set
- JNP -...
- JPE -jump if parity even (same as JP)
- JPO -jump if parity odd (same as JNP)
-
- JS -jumps if sign flag is set
- JNS -...
-
-
- Here's the flags really quickly:
- ────────────────────────────────
- bit# 8 7 6 5 4 3 2 1 0
- ─────────────────
- symbol: O D I T S Z A P C
-
- O = OverFlow flag
- D = Direction flag *
- I = Interrupt flag
- T = Trap flag
- S = Sign flag
- Z = Zero flag *
- A = Auxiliary flag
- C = Carry flag *
-
- The * denotes the ones that you should know.
-
- ─────────────────────────────────────────────────────────────────────────────
-
- That's it for now... Until next time...
-
- Draeden\VLA
-